﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;
using BLL;
using WcfServices.ServiceInterfaces;
using EntitiesLayer;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using System.Net;
using System.Data.SqlClient;
using WcfServices.Utilities;
using System.IO;
using System.Drawing;

namespace WcfServices
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class EjercicioService : IEjercicioService
    {
        private GestorMantenimientoEjercicios gestor;
    
        public EjercicioService() {

            gestor = new GestorMantenimientoEjercicios();
        
        }

        public string Listar() {
            

            IEnumerable<Ejercicio> listaEjericicios= 
                Util.interceptWithReturn(gestor.ListarEjercicios);

            if (listaEjericicios != null)
                return listaEjericicios.JsonSerialize(ignoreTypes: new[] { typeof(IList<>) });
              
            return "";

            
        }

        public string BuscarPorId(int id)
        {
            Ejercicio ejericicio =
               Util.interceptWithReturn(()=>gestor.GetById(id));

            if (ejericicio != null)            
                return ejericicio.JsonSerialize(ignoreTypes: new []{typeof(IList<>)});


            return "";
        }


        public void Create(Stream json)
        {
            EjercicioInfo data = json.DeserializeJson<EjercicioInfo>();

            IDictionary<string, string> infoEjercicio= data.infoEjercicio;

            Util.interceptWithNoReturn(
                () =>
                gestor.registrarEjercicio(infoEjercicio["Nombre"], infoEjercicio["Segundonombre"],
                infoEjercicio["PosInicial"], infoEjercicio["PosFinal"], infoEjercicio["Indicaciones"],
                infoEjercicio["Errores"], data.relacionPrimarios, data.relacionSecundarios)
            );
        }

        public void Delete(int id)
        {
            gestor.eliminarEjercicio(id);
            Util.interceptWithNoReturn(gestor.guardarCambiosEjercicios);
        }

        public void Update(Stream json)
        {
            IDictionary<string, string> ejercicio= json.DeserializeJson<Dictionary<string, string>>();

            gestor.ModificarEjercicio(Convert.ToInt32(ejercicio["Id"]), 
                ejercicio["Nombre"], ejercicio["Segundonombre"], ejercicio["PosInicial"], 
                ejercicio["PosFinal"], ejercicio["Indicaciones"], ejercicio["Errores"]);

            Util.interceptWithNoReturn(gestor.guardarCambiosEjercicios);
        }


        public string ConsultarImagenes(int idEjercicio)
        {
            IList<Imagen> ejercicio=Util.interceptWithReturn(
                () => gestor.ConsultarImagenesEjercicio(idEjercicio));

            if (ejercicio != null)
                return ejercicio.JsonSerialize(new[] { typeof(Bitmap) });

            return "";
            
        }

        public void RegistrarImagen(int ejercicio, string imagen, string descripcion)
        {
            gestor.RegistrarImagen(ejercicio, imagen.ToImageByte().toBitMap(), descripcion);
            Util.interceptWithNoReturn(gestor.guardarCambiosImagenes);
        }

        public void ModiciarDescipcionImagen(int idImagen, string descripcion)
        {
            gestor.ModificarImagen(idImagen, descripcion);
            Util.interceptWithNoReturn(gestor.guardarCambiosImagenes);
        }

        public void EliminarImagen(int idImagen)
        {
            gestor.EliminarImagen(idImagen);
            Util.interceptWithNoReturn(gestor.guardarCambiosImagenes);
        }


        public string EjerciciosAleatorioPorUbicacion()
        {
            IEnumerable<Ejercicio> listaEjericicios =
             Util.interceptWithReturn(gestor.listarReposiotriosRandomPorUbicacion);

            if (listaEjericicios != null)
                return listaEjericicios.JsonSerialize(ignoreTypes: new[] { typeof(IList<>) });

            return "";
        }
    }

    public class EjercicioInfo{


        [JsonProperty("Info")]
        public IDictionary<string, string> infoEjercicio{get; set;}

        [JsonProperty("IdsP")]
        public IList<long> relacionPrimarios { set; get; }

        [JsonProperty("IdsM")]
        public IList<long> relacionSecundarios { set; get; }

}
}
